package pildemil

import com.google.appengine.api.datastore.*


class ParticipantController {

	def persistenceManager
	def transactionService
    
    static allowedMethods = [ajouter:'POST', sauver:'POST']
	
	def index = {
		redirect(action:'liste')
	}
	
	def liste = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		def transaction = persistenceManager.currentTransaction()
		
		transactionService.calculMaj(projet)
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
		}
		
		def listeParticipant = projet.participants
		render(view:"liste", model:["listeParticipant":listeParticipant])
	}
	
	def creer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		Participant participant = new Participant(params)
        return [participant: participant]
	}
	
	def ajouter = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		Participant participant = new Participant(params)
		participant.projet = projet
		projet.participants << participant
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
		}
		
		redirect("action":liste)
	}
	
	def editer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def participantKey = KeyFactory.createKey(projetKey, Participant.simpleName, params.id.toInteger())
	    Participant participant = persistenceManager.getObjectById(Participant.class, participantKey)
			
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			participant = persistenceManager.detachCopy(participant)
			transaction.commit()
			
			render(view:"editer", model:['participant': participant])
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			redirect("action":liste)
		}
	}
	
	def sauver = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def participantKey = KeyFactory.createKey(projetKey, Participant.simpleName, params.id.toInteger())
	    Participant participant = persistenceManager.getObjectById(Participant.class, participantKey)
		
		participant.properties = params
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			transaction.commit()
			
			redirect("action":liste)
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			render(view:"editer", model:['participant': participant])
		}
	}
	
	def supprimer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		def participantKey = KeyFactory.createKey(projetKey, Participant.simpleName, params.id.toInteger())
	    Participant participant = persistenceManager.getObjectById(Participant.class, participantKey)
		
		if (participant.estResponsable) {
			def message = "Attention : Il n'est pas possible de supprimer le responsable de l'évènement. Vous pouvez seulement le modifier."
			render(view:"editer", model:['participant':participant,'message':message])
		} else {
			
			// recherche des dépenses associées
			projet.depenses.each { depense ->
				if (depense.payeur == participantKey) {
					depense.payeur = projet.responsable
				}
				depense.consommateurs.remove(participantKey)
				if (depense.consommateurs.empty) {
					depense.consommateurs.add(projet.responsable)
				}		
			}
			
			def transaction = persistenceManager.currentTransaction()
			
			try {
				transaction.begin()
	            persistenceManager.deletePersistent(participant)
				transaction.commit()
	        } catch(Exception e) {
				if (transaction.isActive()) { transaction.rollback(); }
	        }
			
			redirect("action":liste)
		}
	}
}
